package com.sky.websocket.controller;


import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * WebSocket服务
 */
@Component
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {

    /**concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。*/
    //存放会话对象
    private static Map<String, Session> sessionMap = new ConcurrentHashMap<String, Session>();

    /**静态变量，用来记录当前在线连接数。应该把它设计成线程安全的。*/
    private static AtomicInteger count = new AtomicInteger(0);
    /**与某个客户端的连接会话，需要通过它来给客户端发送数据*/
    private Session session;
    /**接收sid*/
    private String sid = "";



    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam(value="sid")String sid){
        System.out.println("客户端(浏览器)：" + sid + " 建立连接 ");
        sessionMap.put(sid, session);
        this.sid = sid;
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message  客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, @PathParam(value = "sid")String sid){
        System.out.println("收到来自客户端(浏览器)：" + sid + " 发送过来的消息：" + message);
    }

    /**
     * 错误
     */
    @OnError
    public void onError(Session session, Throwable error){
        System.out.println("客户端 " + this.sid +" 错误信息，原因：" + error.getMessage());
    }

    /**
     * 连接关闭调用的方法
     *
     * @param sid
     */
    @OnClose
    public void onClose(@PathParam(value = "sid")String sid){
        System.out.println("连接断开：" + sid);
        sessionMap.remove(sid);
    }



    /**
     * 群发
     *    推送消息
     */
    public void sendAllMessage(String message){
        Collection<Session> sessionCollection = sessionMap.values();
        for (Session sess : sessionCollection) {
            try {
                sess.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

//    /**
//     * 精准
//     *    推送消息
//     */
//    public void sendMessage(String message){
//        Session sess = sessionMap.get(this.sid);
//        try {
//            sess.getBasicRemote().sendText(message);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }


}
